const { AsyncParallelHook } = require('tapable')

let hook = new AsyncParallelHook(['name'])

// 对于异步钩子的使用， 在添加事件监听时会存在三种方式： tap tapAsync tapPromise

// 使用 tap
// console.time('time')
// hook.tap('fn1', function (name) {
//     console.log('fn1-->', name)
// })
// hook.tap('fn2', function (name) {
//     console.log('fn2-->', name)
// })

// // 异步监听  
// hook.callAsync('AsyncParallelHook', function () {
//     console.log('最后执行了回调操作')
//     console.timeEnd('time')
// })


// tapAsync
// console.time('time')
// hook.tapAsync('fn1', function (name, callback) {
//     setTimeout(()=>{
//         console.log('fn1--->', name)
//         callback()
//     }, 1000)
// })
// hook.tapAsync('fn2', function (name, callback) {
//     setTimeout(()=>{
//         console.log('fn2--->', name)
//         callback()
//     }, 2000)
// })
// hook.callAsync('tapAsync', function () {
//     console.log('最后一个回调执行了')
//     console.timeEnd('time')
// })


// promise
console.time('time')
hook.tapPromise('fn1', function (name) {
    return new Promise(resolve=>{
        setTimeout(()=>{
            console.log('fn1--->', name)
            resolve()
        }, 1000)
    })
})
hook.tapPromise('fn2', function (name) {
    return new Promise(resolve=>{
        setTimeout(()=>{
            console.log('fn2--->', name)
            resolve()
        }, 2000)
    })
})
hook.promise('tapPromise').then(()=>{
    console.log('最后一个回调执行了')
    console.timeEnd('time')
})

